﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Gestion
{
    public partial class ClientesBusq : Form
    {
        // Controla si la última fila seleccionada se considera activa
        // para operaciones de Modificación o Baja.
        private Boolean bFilaActiva;


        public ClientesBusq()
        {
            InitializeComponent();
        }

        private void ClientesBusq_Load(object sender, EventArgs e)
        {
            
            // Cargar Combo Provincias
            clsComunGestion.CargaComboProvincias(ref cboProvincia, true);

            // Por defecto, se marcará la línea vacia.
            cboProvincia.SelectedValue = 0;

            // Inicializar la búsqueda por Fecha Nacimiento
            // Inicialmente no está activada. Se deshabilitan ambas fechas
            chkFechaNac.Checked = false;
            lblFechaNacDesde.Enabled = false;
            lblFechaNacHasta.Enabled = false;
            txtFechaNacDesde.Enabled = false;
            txtFechaNacHasta.Enabled = false;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            // Ahora se hace con la clase clsClientesBD.cs

            DataTable miTabla = new DataTable();

            // Linea para gestionar la lista
            ListViewItem lineaLista;

            // Inicializar el control ListView
            lstClientes.Items.Clear();

            try
            {
                miTabla = clsClientesBD.Buscar(txtCodigo.Text, txtDNI.Text, txtNombre.Text, txtApellidos.Text,
                    int.Parse(cboProvincia.SelectedValue.ToString()), chkFechaNac.Checked, txtFechaNacDesde.Value,
                    txtFechaNacHasta.Value);

                if (miTabla.Rows.Count == 0)
                {
                    MessageBox.Show("No existe ningún cliente con estos criterios.",
                        "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                { // Procesamos los resultados
                    foreach (DataRow dr in miTabla.Rows)
                    {
                        lineaLista = new ListViewItem();
                        lineaLista.Text = dr["cod_cli"].ToString();
                        lineaLista.SubItems.Add(dr["apellidos"].ToString());
                        lineaLista.SubItems.Add(dr["nombre"].ToString());

                        // Para casos de importes podemos usar el metodo ImporteFormato de la clase comun
                        // y luego cd le añado el objeto cliente para insertarlo en BD tb hay que usar la funcion
                        // asi se vera el importe con el formato correcto en visualizar datos (detalles)
                        // Hay que usar dos eventos, el enter para formatear el numero al entrar y el leave al salir
                        // Al darle a ACEPTAR para guardar los cambios hay que llamar a la funcion que le quita el formato
                        // para guardarlo en BD (ImporteSQL)

                        //lineaLista.SubItems.Add(clsComun.ImporteFormato(dr["tlf_fijo"].ToString()));
                        lineaLista.SubItems.Add(dr["tlf_fijo"].ToString());

                        lstClientes.Items.Add(lineaLista);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,
                                "Error",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void lstClientes_DoubleClick(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle

            // Crear instancia del formulario de detalle
            frmDetalle = new ClientesDet();

            // Asignar el modo de operación de Consulta
            frmDetalle.setModOpe(ModosOper.Consulta);

            // Indicar el código del cliente a mostrar
            frmDetalle.setCodigo(lstClientes.FocusedItem.Text);

            // Mostrar la ventana de detalle
            frmDetalle.ShowDialog();
        }

        private void btnAnadir_Click(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle
            DialogResult resp;          // Respuesta del formulario de detalle

            // Crear instancia del formulario de detalle
            frmDetalle = new ClientesDet();

            // Asignar el modo de operación
            frmDetalle.setModOpe(ModosOper.Alta);

            // Mostrar la ventana de detalle
            resp = frmDetalle.ShowDialog();

            // Si se ha cerrado el formulario de detalle aceptando la operación,
            // y la lista estaba cargada
            if (resp == DialogResult.OK & lstClientes.Items.Count > 0)
            {
                // Ejecutar la búsqueda para refrescar la lista
                btnBuscar_Click(sender, e);
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle
            DialogResult resp;          // Respuesta del formulario de detalle

            // Si no se ha seleccionado ninguna línea de la lista,
            // o no se considera activa (el foco no viene de la lista)
            if (lstClientes.SelectedItems.Count == 0 | bFilaActiva == false)
            {
                // Mostrar mensaje de aviso. No se accederá al al Detalle
                MessageBox.Show("Debe seleccionar un Cliente.",
                                "Aviso",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            else
            {
                // Hay una línea seleccionada, se accederá al Detalle

                // Crear instancia del formulario de detalle
                frmDetalle = new ClientesDet();

                // Asignar el modo de operación de Modificación
                frmDetalle.setModOpe(ModosOper.Modificacion);

                // Indicar el código del cliente a mostrar
                frmDetalle.setCodigo(lstClientes.FocusedItem.Text);

                // Mostrar la ventana de detalle
                resp = frmDetalle.ShowDialog();

                // Si se ha cerrado el formulario de detalle aceptando la operación
                if (resp == DialogResult.OK)
                {
                    // Ejecutar la búsqueda para refrescar la lista
                    btnBuscar_Click(sender, e);
                }
                else
                {
                    // Volver a marcar la línea que estaba seleccionada de la lista
                    lstClientes.Focus();
                    lstClientes.Items[lstClientes.FocusedItem.Index].Selected = true;
                }
            }
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle
            DialogResult resp;          // Respuesta del formulario de detalle

            // Si no se ha seleccionado ninguna línea de la lista,
            // o no se considera activa (el foco no viene de la lista)
            if (lstClientes.SelectedItems.Count == 0 | bFilaActiva == false)
            {
                // Mostrar mensaje de aviso. No se accederá al al Detalle
                MessageBox.Show("Debe seleccionar un Cliente.",
                                "Aviso",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            else
            {
                // Hay una línea seleccionada, se accederá al Detalle

                // Crear instancia del formulario de detalle
                frmDetalle = new ClientesDet();

                // Asignar el modo de operación de Baja
                frmDetalle.setModOpe(ModosOper.Baja);

                // Indicar el código del cliente a mostrar
                frmDetalle.setCodigo(lstClientes.FocusedItem.Text);

                // Mostrar la ventana de detalle
                resp = frmDetalle.ShowDialog();

                // Si se ha cerrado el formulario de detalle aceptando la operación
                if (resp == DialogResult.OK)
                {
                    // Ejecutar la búsqueda para refrescar la lista
                    btnBuscar_Click(sender, e);
                }
                else
                {
                    // Volver a marcar la línea que estaba seleccionada de la lista
                    lstClientes.Focus();
                    lstClientes.Items[lstClientes.FocusedItem.Index].Selected = true;
                }
            }
        }

        private void txtCodigo_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Comprobar que la tecla pulsada es válida para un campo que solo contiene Números
            clsComun.TeclaNumero(sender, e);
        }

        private void txtDNI_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Comprobar que la tecla pulsada es válida para un campo que solo contiene Letras y Números
            clsComun.TeclaLetraNumero(sender, e);
        }

        private void lstClientes_Leave(object sender, EventArgs e)
        {
            // Cuando la lista pierde el foco, la línea seleccionada vuelve a
            // su aspecto normal, pero internamente la fila sigue seleccionada.

            // Si el foco va directamente al botón Modificar o Borrar,
            // se permitirá la operación (la fila seleccionada sigue estando activa).
            if (btnModificar.Focused | btnBorrar.Focused)
            {
                // La fila se considera activa (permitir Modificación o Baja)
                bFilaActiva = true;
            }
            else
            {
                // La fila NO se considera activa (impedir Modificación o Baja)
                bFilaActiva = false;
            }
        }

        private void chkFechaNac_CheckedChanged(object sender, EventArgs e)
        {
            // Si la check está marcada
            if (chkFechaNac.Checked == true)
            {
                // Habilitar los campos de Fecha Nacimiento
                lblFechaNacDesde.Enabled = true;
                lblFechaNacHasta.Enabled = true;
                txtFechaNacDesde.Enabled = true;
                txtFechaNacHasta.Enabled = true;
            }
            else
            {
                // La check no está marcada

                // Deshabilitar los campos de Fecha Nacimiento
                lblFechaNacDesde.Enabled = false;
                lblFechaNacHasta.Enabled = false;
                txtFechaNacDesde.Enabled = false;
                txtFechaNacHasta.Enabled = false;
            }

            // Ha cambiado este campo del filtro
            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtCodigo_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtDNI_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtApellidos_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtNombre_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtFechaNacDesde_ValueChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtFechaNacHasta_ValueChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

    }
}
